# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=thumbv7m-none-eabi -run-pass=arm-cp-islands -o - %s | FileCheck %s

--- |
  define i32* @test_simple(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_notfirst(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_redefined(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_notredefined(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_notcmp(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_killflag_1(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_killflag_2(i32* %x, i32 %y) { ret i32* %x }
  define i32* @test_cpsr(i32* %x, i32 %y) { ret i32* %x }

  declare dso_local i32 @c(i32 %x)
...
---
name:            test_simple
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_simple
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   tCBZ renamable $r0, %bb.2
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 renamable $r0, 0, 14, $noreg, implicit-def $cpsr
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_notfirst
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_notfirst
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   renamable $r0, $cpsr = tADDrr killed renamable $r0, renamable $r1, 14 /* CC::al */, $noreg
  ; CHECK:   renamable $r1 = t2ADDrs renamable $r0, killed renamable $r1, 18, 14 /* CC::al */, $noreg, $noreg
  ; CHECK:   tCBZ renamable $r0, %bb.2
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    renamable $r0, $cpsr = tADDrr killed renamable $r0, renamable $r1, 14, $noreg
    tCMPi8 renamable $r0, 0, 14, $noreg, implicit-def $cpsr
    renamable $r1 = t2ADDrs renamable $r0, killed renamable $r1, 18, 14, $noreg, $noreg
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_redefined
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_redefined
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
  ; CHECK:   renamable $r0 = t2ADDrs killed renamable $r0, killed renamable $r1, 18, 14 /* CC::al */, $noreg, $noreg
  ; CHECK:   tBcc %bb.2, 0 /* CC::eq */, killed $cpsr
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 renamable $r0, 0, 14, $noreg, implicit-def $cpsr
    renamable $r0 = t2ADDrs killed renamable $r0, killed renamable $r1, 18, 14, $noreg, $noreg
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_notredefined
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_notredefined
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   renamable $r1 = t2ADDrs renamable $r0, killed renamable $r1, 18, 14 /* CC::al */, $noreg, $noreg
  ; CHECK:   tCBZ renamable $r0, %bb.2
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 renamable $r0, 0, 14, $noreg, implicit-def $cpsr
    renamable $r1 = t2ADDrs renamable $r0, killed renamable $r1, 18, 14, $noreg, $noreg
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_notcmp
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_notcmp
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
  ; CHECK:   renamable $r1, $cpsr = tADDrr renamable $r0, killed renamable $r1, 14 /* CC::al */, $noreg
  ; CHECK:   tBcc %bb.2, 0 /* CC::eq */, killed $cpsr
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 renamable $r0, 0, 14, $noreg, implicit-def $cpsr
    renamable $r1, $cpsr = tADDrr renamable $r0, killed renamable $r1, 14, $noreg
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_killflag_1
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_killflag_1
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   renamable $r0 = t2ADDrs killed renamable $r0, killed renamable $r0, 18, 14 /* CC::al */, $noreg, $noreg
  ; CHECK:   tCBZ killed renamable $r1, %bb.2
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 killed renamable $r1, 0, 14, $noreg, implicit-def $cpsr
    renamable $r0 = t2ADDrs killed renamable $r0, killed renamable $r0, 18, 14, $noreg, $noreg
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_killflag_2
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_killflag_2
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   renamable $r0 = t2ADDrs renamable $r1, killed renamable $r0, 18, 14 /* CC::al */, $noreg, $noreg
  ; CHECK:   tCBZ killed renamable $r1, %bb.2
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 renamable $r1, 0, 14, $noreg, implicit-def $cpsr
    renamable $r0 = t2ADDrs killed renamable $r1, killed renamable $r0, 18, 14, $noreg, $noreg
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...
---
name:            test_cpsr
tracksRegLiveness: true
liveins:
  - { reg: '$r0', virtual-reg: '' }
  - { reg: '$r1', virtual-reg: '' }
body:             |
  ; CHECK-LABEL: name: test_cpsr
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
  ; CHECK:   liveins: $r0, $r1
  ; CHECK:   tCMPi8 renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
  ; CHECK:   t2IT 0, 8, implicit-def $itstate
  ; CHECK:   renamable $r1 = t2ADDri killed renamable $r1, 1, 1 /* CC::ne */, $cpsr, $noreg, implicit killed $itstate
  ; CHECK:   tBcc %bb.2, 0 /* CC::eq */, killed $cpsr
  ; CHECK: bb.1:
  ; CHECK:   liveins: $r0
  ; CHECK:   renamable $r0 = tLDRi killed renamable $r0, 0, 14 /* CC::al */, $noreg :: (load (s32) from %ir.x)
  ; CHECK:   tTAILJMPdND @c, 14 /* CC::al */, $noreg, implicit $sp, implicit $sp, implicit killed $r0
  ; CHECK: bb.2:
  ; CHECK:   $r0, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
  bb.0:
    successors: %bb.1(0x30000000), %bb.2(0x50000000)
    liveins: $r0, $r1

    tCMPi8 renamable $r0, 0, 14, $noreg, implicit-def $cpsr
    t2IT 0, 8, implicit-def $itstate
    renamable $r1 = t2ADDri killed renamable $r1, 1, 1, $cpsr, $noreg, implicit killed $itstate
    t2Bcc %bb.1, 0, killed $cpsr

  bb.2:
    liveins: $r0

    renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg :: (load (s32) from %ir.x)
    tTAILJMPdND @c, 14, $noreg, implicit $sp, implicit $sp, implicit killed $r0

  bb.1:
    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
    tBX_RET 14, $noreg, implicit killed $r0

...

